Technical Q&A QA1190
Filtering the Effects List returned by QTGetEffectsList


Q: QTGetEffectsList ä÷êîÇí Ç∂ǃ QuickTime ÉGÉtÉFÉNÉgÇÃÉäÉXÉgÇéÊìæÇµÇƒÇ¢Ç‹Ç∑ÅBǪÇÃå„ÅADZÇÃÉäÉXÉgÇ QTCreateStandardParameterDialog ä÷êîÇ…ìnǵǃÉ_ÉCÉAÉçÉOÇçÏê¨ÇµÅAÉÜÅ[ÉUÇ™ÉäÉXÉgÇ©ÇÁÉGÉtÉFÉNÉgÇëIëÇ≈Ç´ÇÈÇÊǧDžǵǃǢNjÇ∑ÅBǵǩǵÅAéwíËǵÇΩÉGÉtÉFÉNÉgÇæÇØÇ™ÉäÉXÉgÇ…ï\é¶Ç≥ÇÍÇÈÇÊǧDžÅADZÇÃÉäÉXÉgÇéñëOÇ…ï“èWǵÇΩÇ¢ÇΔévǡǃǢNjÇ∑ÅBDZÇÍÇÕâ¬î\Ç≈ǵÇÂǧǩÅH

A: QuickTime 6 Ç≈ÇÕÅAQTGetEffectsListExtended ÇΔǢǧï÷óòÇ»ä÷êîÇégópǵǃÅAÉGÉtÉFÉNÉgÉäÉXÉgÇ…ì¸ÇÍÇÈÉGÉtÉFÉNÉgÇÉtÉBÉãÉ^èàóùÇ≈Ç´Ç‹Ç∑ÅBDZÇÃä÷êîÇÃäÆëSÇ»ÉhÉLÉÖÉÅÉìÉgÇÕÅAÅuWhat's New in QuickTime 6ÅvDždžÇËÇ‹Ç∑ÅBÉAÉbÉvÉãÇ≈ÇÕÅAQuickTime ÇÃè´óàÇÃÉoÅ[ÉWÉáÉìÇΔÇÃå›ä∑ê´Çï€èÿÇ∑ÇÈÇΩÇflÇ…ÅADZÇÃéËñ@ÇégǧDZÇΔÇã≠Ç≠Ç®ä©ÇflǵNjÇ∑ÅB

ÇΩÇΔǶnjÅAà»â∫Ç…ÅAÉ}ÉãÉ`É\Å[ÉXÇÃÉgÉâÉìÉVÉWÉáÉìÉGÉtÉFÉNÉgÇæÇØÇï\é¶Ç∑ÇÈåƒÇ—èoǵÇÃó·Çé¶ÇµÇ‹Ç∑ÅB

QTAtomContainer effectsList;
OSErr err;


err = QTGetEffectsListExtended(
    &effectsList,
    2,  /* É\Å[ÉXêîÇÃç≈è¨íl */
    -1, /* É\Å[ÉXêîÇÃç≈ëÂílÇÕǻǵ */
    0,  /* getOptions - è»ó™â¬î\ */
    kTransitionMajorClass, /* É}ÉãÉ`É\Å[ÉXÇÃÉÇÅ[ÉtÉGÉtÉFÉNÉgÇÉtÉBÉãÉ^Ç…Ç©ÇØÇÈ */
    kTransitionMinorClass, /* ÉgÉâÉìÉVÉWÉáÉìÇÉtÉBÉãÉ^Ç…Ç©ÇØÇÈ */
    0,  /* ÉIÉvÉVÉáÉìÇÃÉtÉBÉãÉ^èàóù */
    0); /* ÉtÉBÉãÉ^èàóùéËèáÇ…ëŒÇ∑ÇÈÉIÉvÉVÉáÉìÇà refcon  */

ÉäÉXÉg 1Å@QTGetEffectsListExtended ÇégópǵÇΩÉGÉtÉFÉNÉgÉäÉXÉgÇÃÉtÉBÉãÉ^èàóù

QuickTime 5 Ç®ÇÊǗǪÇÍà»ëOÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕÅAQTGetEffectsList Ç…ÇÊǡǃñflÇ≥ÇÍÇΩÉGÉtÉFÉNÉgÇÃÉäÉXÉgÇéËìÆÇ≈ämîFǵÅAï\é¶ÇµÇΩÇ≠ǻǢÉGÉtÉFÉNÉgÇÉäÉXÉgÇ©ÇÁçÌèúÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBQTGetEffectsList Ç©ÇÁñflÇ≥ÇÍÇÈÉäÉXÉgÇ…ÇÕÅAäeÉGÉtÉFÉNÉgÉRÉìÉ|Å[ÉlÉìÉgÇ…ëŒÇµÇƒ 2 ǬÇÃÉAÉgÉÄÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅB1 ǬÇÕÅAå^Ç™ kEffectNameAtom ('name') ÇÃÉAÉgÉÄÇ≈džÇËÅAÉGÉtÉFÉNÉgÇÃñºëOÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBLJǧ 1 ǬÇÕÅAå^Ç™ kEffectTypeAtom ('type') ÇÃÉAÉgÉÄÇ≈ÅAÉGÉtÉFÉNÉgÉRÉìÉ|Å[ÉlÉìÉgÇÃÉTÉuÉ^ÉCÉvÇ≈džÇÈÉGÉtÉFÉNÉgÇÃÉ^ÉCÉvÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBíPèÉDžDZÇÃÉäÉXÉgÇämîFǵǃÅAï\é¶ÇµÇΩÇ≠ǻǢÉGÉtÉFÉNÉgÇ…ëŒâûÇ∑ÇÈ kEffectNameAtom Ç®ÇÊÇ— kEffectTypeAtom ÉAÉgÉÄÇçÌèúǵNjÇ∑ÅBà»â∫ÇÕÅADZÇÃï˚ñ@Çé¶ÇµÇΩÉRÅ[ÉhÇÃó·Ç≈Ç∑ÅB

void BuildAndEditEffectsList() {
    short             childCount, index;
    OSErr             err;
    QTAtomContainer   effectsList, effectSample;
    QTParameterDialog effectsDialog;
        /* DZÇÍÇÁÇ™ÉäÉXÉgÇ…ï\é¶ÇµÇΩÇ¢ÉGÉtÉFÉNÉg */
    const OSType supportedEffects[] = {
        kBlurImageFilterType,
        kBrightnessContrastImageFilterType
    };


        /* ÉGÉtÉFÉNÉgÇÃåªç›ÇÃÉäÉXÉgÇéÊìæ */
        /* ç≈è¨íl == ç≈ëÂíl == -1ÅAǬNjÇËç≈è¨ílLJç≈ëÂílLJǻǵ */
    err = QTGetEffectsList( &effectsList, -1, -1, 0 );
    if (err != noErr) goto bailError;

        /* ÉäÉXÉgíÜÇÃÉGÉtÉFÉNÉgêîÇÃÉJÉEÉìÉgÇéÊìæ */
    childCount = QTCountChildrenOfType(
        effectsList, kParentAtomIsContainer, kEffectNameAtom );
        /* îΩïúèàóùÇé¿çsǵǃÉäÉXÉgíÜÇÃäeÉGÉtÉFÉNÉgÇèàóùǵÅA
        è„Ç≈džÇÁÇ©Ç∂ÇflëIëǵÇΩÉGÉtÉFÉNÉgÇΔàÍívǵǻǢLJÇÃÇçÌèú */
    for( index = childCount; index > 0 ; index -- )
    {
        QTAtom     effectTypeAtom;
        QTAtomID   id;
        long       effectCodeSize;
        Ptr        effectCodePtr;
        OSType     effectCode;
        short      j;
        Boolean    effectIsSupported;

        effectTypeAtom = QTFindChildByIndex( effectsList,
            kParentAtomIsContainer,
            kEffectTypeAtom, index, &id );
        err = QTLockContainer( effectsList );
        if (err != noErr) goto bailError;

        err = QTGetAtomDataPtr( effectsList,
            effectTypeAtom,
            &effectCodeSize,
            &effectCodePtr);
        if (err != noErr) goto bailError;

            /* é¿ç€ÇÃÉGÉtÉFÉNÉgÉRÅ[ÉhÇéÊìæ */
        effectCode = *(OSType *)effectCodePtr;

        err = QTUnlockContainer( effectsList );

            /* åªç›ÇÃÉGÉtÉFÉNÉgÇ™ÅAè„Ç≈ëIëǵÇΩÉäÉXÉgÇ…
            džÇÈǩǫǧǩÉ`ÉFÉbÉN */
        for( j=0, effectIsSupported=false ;
            j<sizeof(supportedEffects)/sizeof(OSType) ; j++ )
        {
            if ( effectCode == supportedEffects[j] )
            {
                effectIsSupported = true;
                break;
            }
        }
            /* è„ãLÇÃÉJÉXÉ^ÉÄÉäÉXÉgÇ…àÍívÇ∑ÇÈLJÇÃǙǻǩǡÇΩèÍçáÇÕÅA
            DZÇÃÉGÉtÉFÉNÉgÇçÌèú */
        if ( !effectIsSupported )
        {
            QTAtom effectNameAtom;

            effectNameAtom = QTFindChildByIndex( effectsList,
                kParentAtomIsContainer, kEffectNameAtom, index, &id );
            err = QTRemoveAtom( effectsList, effectTypeAtom );
            err = QTRemoveAtom( effectsList, effectNameAtom );
        }
    }

        /* êVǵÇ≠çÏê¨Ç≥ÇÍÇΩÉGÉtÉFÉNÉgÉäÉXÉgÇégópǵǃÅA
        ǪÇÃå„Ç≈égópÇ∑ÇÈÉ_ÉCÉAÉçÉOÇçÏê¨ */
    err = QTNewAtomContainer( &effectSample );
    err = QTCreateStandardParameterDialog( effectsList,
            effectSample, 0, &effectsDialog );

bailError:
    return;
}

ÉäÉXÉg 2Å@QTGetEffectsList Ç…ÇÊǡǃñflÇ≥ÇÍÇΩÉGÉtÉFÉNÉgÇÃÉäÉXÉgÇÃï“èW


[2002îN 9 åé 4 ì˙]